package br.fafica.pi1.rightcode.arquivo;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;

import br.fafica.pi1.rightcode.Exception.NaoCompiladoException;
import br.fafica.pi1.rightcode.Exception.NenhumArquivoCompiladoException;
import br.fafica.pi1.rightcode.Filtro.Filtro;

public class CompilerFerramentas {

	private ArrayList <String> filtros; //= new ArrayList <String>();
	private ArrayList <String> c_compilados; //= new ArrayList <String>();
	//private String c_diretorio;
	private String c_arquivo;
	private Charset utf8 = StandardCharsets.UTF_8;
	
	public CompilerFerramentas (ArrayList <String> filtros){
		this.filtros = filtros;
	}
	
	public CompilerFerramentas (){
	}
	
	
			
	public boolean setArquivo(String caminho){
		System.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.7.0_07");
		c_arquivo = caminho;
		
		JavaCompiler compilador = ToolProvider.getSystemJavaCompiler();
		
		int resultado = compilador.run(null, null, null,caminho);
		
		if(resultado == 0){
			System.out.println(caminho+"**Retornou True e Compilou");
			return true;
		}else{
			System.out.println(caminho+"**Retornou False e Nao Compilou");
			return false;
		}
	}
	
	public void getArquivo() throws IOException{
		String linha;

		Path path = Paths.get(c_arquivo);
		BufferedReader r = Files.newBufferedReader(path, utf8);
		while((linha = r.readLine())!= null){
			for(String filtro : filtros){
				if(linha.contains(filtro)){
					System.out.println("Filtro encontrado");
				}
			}
		}
	}
	
	public void setDiretorio(String caminho) throws NaoCompiladoException{
		
		File diretorio = new File(caminho);
		
		String[] lista = diretorio.list();
		
		for(String arq : lista){
			
			File dir = new File(caminho+"/"+arq);
			if (dir.isDirectory())
				this.setDiretorio(caminho+"/"+arq);
			
			boolean resultado = (diretorio.getAbsolutePath()+"/"+arq).endsWith(".java");
			
			if(resultado == true){
				if(setArquivo(diretorio.getAbsolutePath()+"/"+arq)){
					if(c_compilados==null){
						c_compilados = new ArrayList <String>();
					}
					c_compilados.add(diretorio.getAbsolutePath()+"/"+arq);
				}else{
					System.out.println("Não Compilou");
					//throw new NaoCompiladoException();
				}
			}
		}
		
	}
	
	
	public void getDiretorio() throws IOException, NenhumArquivoCompiladoException{
		
		String linha;
		if(c_compilados != null){
			for(String arq : c_compilados){
				Path path = Paths.get(arq);
				BufferedReader r = Files.newBufferedReader(path, utf8);
				while((linha = r.readLine())!= null){
					for(String filtro : filtros){
						if(linha.contains(filtro)){
							System.out.println("Filtro encontrado no arquivo:  "+arq);
						}
					}
				}
			}
		}else{
			throw new NenhumArquivoCompiladoException();
		}
	}
	
	
	
	
	
	
	
	
	
/*	public void getDiretorio() throws IOException{
		File diretorio = new File(c_diretorio);
		
		String linha;
		String[] lista = diretorio.list();
		
		
		for(String arq : lista){
			boolean resultado = (diretorio.getAbsolutePath()+"/"+arq).endsWith(".java");
			
			if(resultado == true){
				Path path = Paths.get(diretorio.getAbsolutePath()+"/"+arq);
				BufferedReader r = Files.newBufferedReader(path, utf8);
				while((linha = r.readLine())!= null){
					for(String filtro : filtros){
						if(linha.contains(filtro)){
							System.out.println("encontrado");
						}
					}
				}
			}
			
		}
		
	}*/
	
	 
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
			/*public static void Compiler(String caminho){
				System.setProperty("Java.home","C:\\Program Files\\Java\\jdk.1.7.0_06");
				
				JavaCompiler compilador = ToolProvider.getSystemJavaCompiler();
				
				int resultado = compilador.run(null, null, null,caminho);
				
				if(resultado == 0){
					System.out.println("Compilação ocorrida com sucesso!");
				}else{
					System.out.println("Compilação falhou!");
				}
			}
			
			public static void BuscaMetodo(String caminho) throws MalformedURLException, ReflectiveOperationException{
				filtro.setConteudo(conteudo);
				
				Path path = Paths.get(caminho);
				
				URL[] urls = new URL[]{ new URL("file://"+caminho)};
				
				URLClassLoader ucl = new URLClassLoader(urls);
				
				String resultado = path.getParent()+"."+ path.getFileName();
				
				
						
				///Precisamos resolver o problema quanto a esse método
				
				System.out.println(caminho.getClass());
				
				resultado.endsWith(".java");
                String className = resultado.replace("src/", "").replace("/", ".").replace(".java", "");

            			
				Class clazz = ucl.loadClass(className);
				
				System.out.println("Class has been successfully loaded");
				
				Method method = clazz.getDeclaredMethod(filtro.getConteudo(), null);
				Object object = clazz.newInstance();
				method.invoke(object, null);
				
				System.out.println("Método encontrado!");
			}
*/
		
			
		


	}


